package Main;


import java.awt.Color;
import java.awt.Graphics;
import java.util.Iterator;
import javax.swing.JPanel;

/**
 *
 * @author Emmanuel
 */
class Drawer extends JPanel {
    
    /**
     * pourcentage de l'ecran qui seras le sol.
     */
    private static final double GROUND_SIZE=0.20;
    private static final double PERSO_MIN_X=0.05;
    /**
     * Le rapport entre les coordonnes dans le modele et celle a l'ecran.
     * 1 pt equivault a ScreenSize/RAPPORT.
     */
    private static final int    RAPPORT=1000;
    
    private Personnage perso;
    private Niveau niveau;
    private GraphicalOption gOption;
    private int parcouru;
    
    public Drawer(Niveau n, Personnage perso, GraphicalOption go) {
        this.perso=perso;
        this.niveau=n;
        this.gOption=go;
        this.parcouru=0;
        
        this.setBackground(gOption.getBackgroundColor());
    }
    
    @Override
    public void paintComponent(Graphics g) {
        effacerPrecedent(g);
        dessiner_perso(g);
        int remove = 0;
        for (Iterator it = niveau.getObstacle().iterator(); it.hasNext();) {
            Obstacle o = (Obstacle) it.next();
            if(leavedScreen(o)) {
                remove++;
            }
            else if(isInScreen(o)) {
                break;
            }
            dessinerObstacle(g, o);
        }
        while(remove>0) {
            niveau.removeObstacle();
            remove--;
        }
        dessinerDistance(g);
    }
    
    private void dessiner_perso(Graphics g) {
        //g.setColor(gOption.getGroundColor());
        g.setColor(Color.yellow); // c'est plus "beau" avec le jaune je trouve.
        g.fillRect(
                (int) ((perso.getPosition().getX()-parcouru)*this.getWidth()/RAPPORT),
                (int) (((1-GROUND_SIZE) * this.getHeight()) - perso.getPosition().getY()*this.getHeight()/RAPPORT-(perso.getSizeY()*this.getHeight()/RAPPORT)),
                (int) (perso.getSizeX()*this.getWidth()/RAPPORT),
                (int) (perso.getSizeY()*this.getHeight()/RAPPORT) );
    }
    
    private boolean isInScreen(Obstacle o) {
        return (o.getPosition().getX()-parcouru>RAPPORT);
    }
    
    private void dessinerObstacle(Graphics g, Obstacle o) {
        //g.setColor(gOption.getGroundColor());
        g.setColor(Color.blue); // c'est plus "beau" avec le bleu je trouve.
        g.fillRect(
                (int) ((o.getPosition().getX()-parcouru)*this.getWidth()/RAPPORT),
                (int) (((1-GROUND_SIZE) * this.getHeight()) - o.getPosition().getY()*this.getHeight()/RAPPORT-(o.getSizeY()*this.getHeight()/RAPPORT) ),
                (int) (o.getSizeX()*this.getWidth()/RAPPORT),
                (int) (o.getSizeY()*this.getHeight()/RAPPORT) );
    }
    
    private boolean leavedScreen(Obstacle o) {
        return (o.getPosition().getX()+o.getSizeX()<parcouru);
    }
    
    private void effacerPrecedent(Graphics g) {
        g.setColor(this.gOption.getBackgroundColor());
        g.fillRect(0, 0, this.getWidth(), this.getHeight());
        g.setColor(this.gOption.getGroundColor());
        g.fillRect(0, (int)(this.getHeight()*(1-GROUND_SIZE)), this.getWidth(), (int)(this.getHeight()*GROUND_SIZE)+1);
    }

    public void deplacer() {
        parcouru+=Personnage.getDeplacement();
    }

    private void dessinerDistance(Graphics g) {
        g.setColor(Color.white);
        g.drawString("Distance : "+(parcouru/75), this.getWidth()-125, 25);
    }

    public int getParcouru() {
        return this.parcouru;
    }
}
